// ES5 中作用域
const callbacks = []
for (var i = 0; i <= 2; i++) {           //var-将-a-提升到最前面
    callbacks[i] = function() {
        return i * 2                       //返回的-表达式。
    }
}

console.table([
    callbacks[0](),                        //这个闭包里面的-a变量是全局变量-是3【闭包的作用域是全局】
    callbacks[1](),
    callbacks[2](),
])

const callbacks2 = []
for (let j = 0; j <= 2; j++) {          //let-将-a-定义在块作用域里面了
    callbacks2[j] = function() {
        return j * 2
    }
}

console.table([
    callbacks2[0](),                    //这个闭包里面的-a变量是块作用域里面声明的那个变量了
    callbacks2[1](),
    callbacks2[2](),
])



//下面是块作用域隔离的例子
// 立即执行函数(两个立即执行函数里面的常量不互相影响~！)
;((function() {
    const foo = function() {
        return 1
    }
    console.log("foo()===1", foo() === 1)

;((function() {
        const foo = function() {
            return 2
        }
        console.log("foo()===2", foo() === 2)
    })())
})())


//es6  仅仅使用一个花括号  就形成了作用域了
{
    function foo() {
        return 1
    }

    console.log("foo()===1", foo() === 1)
    {                                      //第二个 function在花括号中~！
        function foo() {
            return 2
        }

        console.log("foo()===2", foo() === 2)
    }
    console.log("foo()===1", foo() === 1)
}
